﻿using System;
using System.Diagnostics;
using System.Reflection;
using Gqq.Csharpindepth.Designpatter.Moduals;

namespace Gqq.Csharpindepth.Designpatter
{
    /// <summary>
    /// 工厂模式
    /// </summary>
    public class AnimalFactory
    {
        /// <summary>
        /// 利用反射实现的工厂
        /// 利用反射实现工厂，可以避免Switch。。。case。。。
        /// </summary>
        /// <param name="name">根据传入的参数名，利用反射实现工厂。</param>
        /// <returns></returns>
        public Animal CreateAnimal(string name)
        {
//            return (Animal) typeof(Animal).Assembly.
//                CreateInstance(name, true, BindingFlags.CreateInstance, null, new object[] {"333"}, null, null);
            const string namesp = "Gqq.Csharpindepth.Designpatter.Moduals.";
            Type t = Type.GetType(namesp + name, true, true);
            //对于默认参数，这样是不对的
            //当得到了一个Type的时候，我们可以利用GetXXX获得多数我们需要的东西。
            ConstructorInfo ci = t.GetConstructor(new[] {typeof (string)});
            Debug.Assert(ci != null, "ci != null");
            //利用反射调用构造函数
            return (Animal)ci.Invoke(new object[] {name});
        }
    }
}